#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start()
{
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;//SDA和SCL置0有先后顺序
	I2C_SCL=0;
}

/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_Stop()
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
		I2C_SDA=Byte&(0x80>>i);
		I2C_SCL=1;	
		I2C_SCL=0;//置0是为了下一次主机将数据位放到SDA线上	
	}
}

/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_ReceiveByte()
{
	unsigned char i=0;
	unsigned char Byte=0x00;
	//主机在接收前，要释放SDA，把控制权交给从机
	I2C_SDA=1;
	for(i=0;i<8;i++)
	{
		I2C_SCL=1;
		if(I2C_SDA)
		{
			Byte|=(0x80>>i);
		}
		I2C_SCL=0;	
	}
	return Byte;
}

/**
  * @brief  I2C发送应答
  * @param  AckBit 应答位，0为应答，1为非应答
  * @retval 无
  */
//发送时序：设置SDA → 拉高SCL → 接收方读取 → 拉低SCL
void I2C_SendAck(unsigned char AckBit)
{
	//SDA给应答为0
	I2C_SDA=AckBit;
	I2C_SCL=1;//数据在SCL为高电平时被采样和读取
	I2C_SCL=0;//拉低SCL时钟线，完成应答周期
}

//接收时序：释放SDA → 拉高SCL → 读取SDA → 拉低SCL
unsigned char I2C_ReceiveAck()
{
	unsigned char AckBit;
	I2C_SCL=1;
	I2C_SDA=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;// 拉低SCL时钟线，完成应答周期
	return AckBit;
}